// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // package org.uma.jmetal.qualityindicator.impl; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.uma.jmetal.qualityindicator.QualityIndicator; import org.uma.jmetal.solution.Solution; import org.uma.jmetal.util.JMetalException; import org.uma.jmetal.util.SolutionListUtils; import org.uma.jmetal.util.naming.impl.SimpleDescribedEntity; import java.util.List; /** * Set coverage metric * * @author Antonio J. Nebro * @version 1.0 */ @SuppressWarnings("serial") public class SetCoverage extends SimpleDescribedEntity implements QualityIndicator<Pair<List<? extends Solution<?>>, List<? extends Solution<?>>>, Pair<Double, Double>> { /** * Constructor */ public SetCoverage() { super("SC", "Set coverage") ; } @Override public Pair<Double, Double> evaluate( Pair<List<? extends Solution<?>>, List<? extends Solution<?>>> pairOfSolutionLists) { List<? extends Solution<?>> front1 = pairOfSolutionLists.getLeft() ; List<? extends Solution<?>> front2 = pairOfSolutionLists.getRight() ; if (front1 == null) { throw new JMetalException("The first front is null") ; } else if (front2 == null) { throw new JMetalException("The second front is null"); } return new ImmutablePair<>(evaluate(front1, front2), evaluate(front2, front1)); } /** * Calculates the set coverage of set1 over set2 * @param set1 * @param set2 * @return The value of the set coverage */ public double evaluate(List<? extends Solution<?>> set1, List<? extends Solution<?>> set2) { double result ; int sum = 0 ; if (set2.size()==0) { if (set1.size()==0) { result = 0.0 ; } else { result = 1.0 ; } } else { for (Solution<?> solution : set2) { if (SolutionListUtils.isSolutionDominatedBySolutionList(solution, set1)) { sum++; } } result = (double)sum/set2.size() ; } return result ; } @Override public String getName() { return super.getName() ; } }